﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace SW2A311A
{
    #region Enums
    public enum ESmiley { Negative, Neutral, Positive }
    public enum EEnergyClass { A, B, C, D, E, F, G }
    #endregion

    public abstract class Product : IEquatable<Product>
    {
        #region Instansvariabler
        public string Name //Må ikke være null eller whitespace
        {
            get { return _name; }
            private set
            {
                if (string.IsNullOrWhiteSpace(value))
                    throw new ArgumentOutOfRangeException("Name", "Må ikke være tom eller whitespace");
                else
                {
                    _name = value;
                }
            }
        }
        private string _name;

        public double Price //Skal være over 0
        {
            get { return _price; }
            private set
            {
                if (value >= 0)
                    _price = value;
                else
                {
                    throw new ArgumentOutOfRangeException("Price", "Skal være positivt tal");
                }
            }
        }
        private double _price;
        #endregion

        #region Constructor
        public Product(string name, double price)
        {
            Name = name;
            Price = price;
        }
        #endregion

        #region Metoder
        #region Equals metoder
        // Override af Equals metoden. Den tester om objektet metoden kaldes på er værdi-mæssigt ens med indput parameter objektet.
        // Sammenligning med et object (hvis typen ikke kendes).
        public override bool Equals(Object obj)
        {
            if (obj == null)
                return false;

            //If parameter cannot be cast to Product return false
            if (this.GetType() != obj.GetType())
                return false;

            Product p = obj as Product;

            return (Name == p.Name) &&
                (Price == p.Price);
        }

        // Sammenligning med en anden VentingDryer hvor typen kendes.
        public bool Equals(Product p)
        {
            if (this.GetType() != p.GetType())
                return false;

            return (Name == p.Name) &&
                (Price == p.Price);
        }
        // GetHashCode skal overrides sammen med Equals. Vi generer en seudo-telfældig hash kode.
        public override int GetHashCode()
        {
            return Name.GetHashCode() ^
                Price.GetHashCode();
        }
        #endregion
        #endregion
    }
}
